package f.h.dragon.util;

import java.io.File;
import java.io.FileFilter;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 文件工具类：
 * 
 * @author F.H Dragon(wenlong.meng@gmail.com)
 * @version 1.0 at 2011/11/28
 * @since 1.0
 */
public class FileUtil {
	
	/**
	 * 指定路径文件添加信息，若不存在则创建
	 * 
	 * @param path 路径
	 * @param msg 信息
	 */
	public static void append(String path, String msg){
		FileWriter out = null;
		try {
			out = new FileWriter(new File(path), true);
			out.append(msg);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}finally{
			CloseableUtil.close(out);
		}
	}
	
	/**
	 * 指定路径文件添加信息，若不存在则创建
	 * 
	 * @param path 路径
	 * @param msg 信息
	 */
	public static void appendln(String path, String msg){
		FileWriter out = null;
		try {
			out = new FileWriter(new File(path), true);
			out.append(msg).append('\n');		
		} catch (IOException e) {
			throw new RuntimeException(e);
		}finally{
			CloseableUtil.close(out);
		}
	}
	
	/**
	 * 删除rootDir目录中(包含其所有层子目录)符合filter规则的文件或文件夹
	 * 
	 * @param rootDir
	 * @param filter
	 * @param type
	 */
	public static void deletes(String rootDir, String filter, FileType type){
		File file = new File(rootDir);
		FileFilter _filter = new SimpleFileFilter(filter);
		if(type == FileType.Dir){
			deleteDirs(file, _filter);
		}
	}
	
	/**
	 * 删除rootDir目录中(包含其所有层子目录)符合filter规则的文件夹
	 * 
	 * @param rootDir
	 * @param filter
	 * @param type
	 */
	public static void deleteDirs(File file, FileFilter filter){
		if(file.isDirectory()){
			if(filter.accept(file)){
				delete(file);
				System.out.println("delete dir: " + file.getAbsolutePath());
			}else{
				File[] files = file.listFiles();
				for(File f : files){
					deleteDirs(f, filter);
				}
			}
		}
	}
	
	/**
	 * 删除文件或目录
	 * 
	 * @param file
	 */
	public static void delete(File file){
		if(file.isFile()){
			file.delete();
		}else if(file.isDirectory()){
			for(File f : file.listFiles()){
				delete(f);
			}
			file.delete();
		}
	}
	
	/**
	 * 简单文件过滤器
	 * 
	 * @author Wenlong Meng(wenlong.meng@gmail.com)
	 * @version 1.0 at 2011/11/28
	 * @since 1.0
	 */
	public static class SimpleFileFilter implements FileFilter{
		
		//local variables
		/**
		 * file name
		 */
		private String fn;
		
		//Constructor
		/**
		 * 构建指定过滤规则的文件过滤器
		 * 
		 * @param fn
		 */
		public SimpleFileFilter(String fn){
			this.fn = fn;
		}

		/**
		 * 判断是否符合过滤规则
		 * 
		 * @param file
		 */
		@Override
		public boolean accept(File file) {
			return fn != null ? fn.equals(file.getName()) : false;
		}
		
	}
	
	/**
	 * 文件类型：文件、目录
	 * 
	 * @author Wenlong Meng(wenlong.meng@gmail.com)
	 * @version 1.0 at 2011/11/28
	 * @since 1.0
	 */
	public static enum FileType{
		File,
		Dir
	}
	
}
